class MusicPlayer(object):
    def __new__(cls, *args, **kwargs):
        # 创建对象时，new方法会被自动调用
        print("创建对象，分配空间")

        # 为对象分配空间
        instance = super().__new__(cls)

        # 返回内存地址 必须返回对象的引用即对象的地址，否则Python的解释器就得不到分配了空间的对象引用，就不会调用对象的初始化方法
        # __new__方法是一个静态方法，在调用时需要主动传参cls参数
        return instance

    def __init__(self):
        print("初始化990-90-90-")


player = MusicPlayer()


class Run(object):
    # 记录第一个被创建的对象的引用
    instance = None
    # 记录是否执行过初始化动作
    init_flag = False

    def __new__(cls, *args, **kwargs):
        # 判断类属性是否为None
        if cls.instance is None:
            # 调用父类的父类new方法，为第一个对象分配空间
            cls.instance = super().__new__(cls)
        # 返回类属性保存的对象引用
        return cls.instance

    def __init__(self):
        # 判断是否初始化
        if not self.init_flag:
            print("初始化方法只执行一次")
            self.init_flag = True
        else:
            return


run1 = Run()
print(run1)
run2 = Run()
print(run2)
